
# 显示命令
# 通常make 会把其要执行的命令行在命令执行前输出到屏幕上
# 当我们用 @ 字符在命令行前, 那么这个命令将不被 make 显示出来
# @echo 正在编译 XXX 模块...... (如果没有 @ 符号, 将会输出:)
# echo 正在编译 XXX 模块......
# 正在编译 XXX 模块......
# make -n 或 --just-print 那么其只是显示命令, 但不会执行命令,这个功能很有利于我们调试我们的 Makefile
# make -s 或 --silent 或 --quiet 则是全面禁止命令的显示








# 命令出错处理
# 1. 在命令前加减号-, 标记为不管命令出不出错都认为是成功的
# 2. 规则是以 .IGNORE 作为目标的, 那么这个规则中的所有命令将会忽略错误
# 3. make -i 或是 --ignore-errors, 那么，Makefile 中所有命令都会忽略错误
# 4. make -k 或是 --keep-going, 如果某规则中的命令出错了, 那么就终止该规则的执行, 但继续执行其它规则









# 嵌套执行 make, 定义 $(MAKE) 变量比较利于维护 (make 命令可能会有参数)
subsystem:
	cd subdir && $(MAKE)
# 等价于
subsystem:
	$(MAKE) -C subdir

# 总控 Makefile 的变量可以传递到下级的 Makefile 中
export variable = value
# 等价于
variable = value
export variable
# 需要注意的是, 有两个变量, 一个是SHELL, 一个是MAKEFLAGS, 这两个变量不管你是否export
# 其总是要传递到下层Makefile中, 特别是MAKEFLAGS变量, 其中包含了make的参数信息, 如果我们执
# 行"总控Makefile"时有make参数或是在上层Makefile中定义了这个变量, 那么MAKEFLAGS变量将会
# 是这些参数, 并会传递到下层Makefile中, 这是一个系统级的环境变量
# 但是 make 命令中的有几个参数并不往下传递，它们是 -C , -f , -h, -o 和 -W

# make -w 或是 --print-directory 会在 make 的过程中输出一些信息，让你看到目前的工作目录:
# make: Entering directory `/home/chen/gnu/make'
# make: Leaving directory `/home/chen/gnu/make'










# 定义命令包
# 如果 Makefile 中出现一些相同命令序列, 那么我们可以为这些相同的命令序列定义一个变量
# 定义这种命令序列的语法以 define 开始, 以 endef 结束
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef
# 这里, "run-yacc"是这个命令包的名字, 其不要和Makefile中的变量重名.
# 在define和endef中的两行就是命令序列.
# 这个命令包中的第一个命令是运行 yacc 程序, 因为Yacc程序总是生成"y.tab.c"的文件
# 所以第二行的命令就是把这个文件改改名字

# 命令包的使用:
foo.c : foo.y
	$(run-yacc)


# make在执行命令包时, 命令包中的每个命令会被依次独立执行
